package com.lzk.seckill.redis;

import com.lzk.seckill.uitil.JedisPoolUtil;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;

import java.util.List;

/**
 * author: 刘中魁
 */
public class SecKillRedis {
    //编写测试方法看看是否连通到redis
    @Test
    public void testRedis(){
        Jedis jedis = new Jedis("192.168.198.135", 6379);
//        jedis.auth("foobared"); //如果去掉了 认证 需要把保护模式 设置为no
        System.out.println( jedis.ping());
        jedis.close();
    }
    /**
     * @param uid 在后台生成
     * @param ticketNo  票的编号 比如北京到成都  bj_cd
     * @return
     */
    public static boolean doSecKill(String uid,String ticketNo){
        //uid 和 ticketNo 进行非空校验
        if (uid == null || ticketNo == null){
            return false;
        }
        //连接到Redis
//        Jedis jedis = new Jedis("192.168.198.135", 6379);
        // 通过连接池获取jedis对象
        JedisPool jedisPoolInstance = JedisPoolUtil.getJedisPoolInstance();
        Jedis jedis = jedisPoolInstance.getResource();
        System.out.println("=======使用连接池技术=========");

        //拼接票的库存key
//        System.out.println("ticketNo" + ticketNo);
        String stockKey = "sk:" + ticketNo + ":ticket";

        //拼接秒杀用户存放到set集合对应的key
        String userKey =  "sk:" + ticketNo + ":user";

        //监控库存
        jedis.watch(stockKey);

        // 获取到对应的票的库存 判断是否为null
        String stock = jedis.get(stockKey);

        if (stock == null){
            System.out.println(" 秒杀还没有开始 ....");
            jedis.close(); //释放jedis 到连接池
            return false;
        }

        //判断用户是否复购
        if (jedis.sismember(userKey, uid)){
            System.out.println(uid + "不能重复秒杀...");
            jedis.close();
            return false;
        }
        //判断票的数量 是否还有剩余
        if (Integer.parseInt(stock) <= 0){
            System.out.println("票已经卖完了，秒杀结束");
            jedis.close();
            return false;
        }

//        //可以购买
//        // 1. 将票的库存量减一
//        jedis.decr(stockKey);
//        // 2. 将该用户加入到抢票成功对应的set集合中
//        jedis.sadd(userKey,uid);
        //使用事务完成秒杀
        Transaction multi = jedis.multi();
        //组队操作
        multi.decr(stockKey); //减去票的库存
        multi.sadd(userKey,uid);
        //执行
        List<Object> results = multi.exec();

        if (results == null || results.size() == 0){
            System.out.println("抢票失败..");
            jedis.close();
            return false;
        }

        System.out.println( uid +  "秒杀成功.. ");
        jedis.close();
        return true;
    }

}
